import axios from "axios";
import { ElMessage, ElLoading } from "element-plus";
import errorCode from "@/utils/errorCode";
import { blobValidate } from "@/utils/taf";
import { useUserStore } from "@/stores";
import router from "@/router";
import cache from "@/plugins/cache";
import { saveAs } from "file-saver";
import { useMiddleVarStore } from "@/stores";

let downloadLoadingInstance;
// const baseURL = 'http://big-event-vue-api-t.itheima.net'
// 获取环境中的后端URL
const baseURL = import.meta.env.VITE_APP_BASE_API;
const instance = axios.create({
  // TODO 1. 基础地址，超时时间
  baseURL,
  timeout: 20000,
});

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // TODO 2. 携带token
    const useStore = useUserStore();
    if (useStore.token) {
      config.headers.authorization = useStore.token;
    }
    if (Object.keys(router.currentRoute.value.meta).length > 0) {
      const title = encodeURIComponent(router.currentRoute.value.meta.title);
      config.headers.title = title;
      // config.headers.pagePath = router.currentRoute.value.path
    }
    // // 浏览器是否支持获取定位
    // if (navigator.geolocation) {
    //   // 浏览提示是否允许获取定位
    //   navigator.geolocation.getCurrentPosition((position) => {
    //     // 获取经纬度
    //     let { latitude, longitude } = position.coords
    //     console.log(43, latitude, longitude)
    //     const apiKey = '43df1b7ce12fdd6fb40f4c19825d169f'
    //     longitude = 112.915239
    //     latitude= 23.198962
    //     fetch(
    //       `https://restapi.amap.com/v3/geocode/regeo?location=${longitude},${latitude}&key=${apiKey}`
    //     )
    //       .then((response) => response.json())
    //       .then((data) => {
    //         console.log('API 响应:', data) // 打印完整的响应
    //         if (data.status === '1') {
    //           const address = data.regeocode.formatted_address
    //           console.log('地址:', address)
    //         } else {
    //           console.error('获取地址失败:', data.info)
    //         }
    //       })
    //       .catch((error) => {
    //         console.error('请求出错:', error)
    //       })
    //   })
    // }

    // 是否需要防止数据重复提交
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
    if (
      !isRepeatSubmit &&
      (config.method === "post" || config.method === "put")
    ) {
      const requestObj = {
        url: config.url,
        data:
          typeof config.data === "object"
            ? JSON.stringify(config.data)
            : config.data,
        time: new Date().getTime(),
      };
      const sessionObj = cache.session.getJSON("sessionObj");
      if (
        sessionObj === undefined ||
        sessionObj === null ||
        sessionObj === ""
      ) {
        cache.session.setJSON("sessionObj", requestObj);
      } else {
        const s_url = sessionObj.url; // 请求地址
        const s_data = sessionObj.data; // 请求数据
        const s_time = sessionObj.time; // 请求时间
        const interval = 1000; // 间隔时间(ms)，小于此时间视为重复提交
        if (
          s_data === requestObj.data &&
          requestObj.time - s_time < interval &&
          s_url === requestObj.url
        ) {
          const message = "数据正在处理，请勿重复提交";
          console.warn(`[${s_url}]: ` + message); // 控制台添加警告打印
          // return Promise.reject(new Error(message)) //控制台添加错误打印
        } else {
          cache.session.setJSON("sessionObj", requestObj);
        }
      }
    }
    return config;
  },
  (err) => Promise.reject(err)
);

// 响应拦截器
instance.interceptors.response.use(
  (res) => {
    const middleVarStore = useMiddleVarStore();
    // const { proxy } = getCurrentInstance();
    // 返回数据
    // return res
    // TODO 4. 摘取核心响应数据
    if (res.data.code == 403) {
      // router.push("/403");
      if (res.data.message) ElMessage.error(res.data.message);
      middleVarStore.setLoginOpen(true)
      // app.config.globalProperties.$loginOpen.value = true;
      return res;
    } else if (res.data.code == 404) {
      // router.push("/404");
      if (res.data.message) ElMessage.error(res.data.message);
      middleVarStore.setLoginOpen(true);
      return res;
    } else {
      return res;
    }
  },
  (err) => {
    // TODO 5. 处理401错误
    // 错误的特殊情况 => 401 权限不足 或 token 过期 => 拦截到登录
    if (err.response?.status === 401) {
      // router.push("/login");
    }

    // 错误的默认情况 => 只要给提示
    // ElMessage.error(err.response.data.message || '服务异常')
    ElMessage.error("服务异常");
    return Promise.reject(err);
  }
);
// 通用下载方法
export function download(url, params, filename, config) {
  /**参数：url=请求地址，params=请求参数，filename=保存文件名，config=其他配置
   * 主要编辑好后端url请求，返回blob数据
   */
  downloadLoadingInstance = ElLoading.service({
    text: "正在下载数据，请稍候",
    background: "rgba(0, 0, 0, 0.7)",
  });
  return instance
    .post(url, params, {
      data: params,
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      responseType: "blob",
      ...config,
    })
    .then(async (data) => {
      const isLogin = await blobValidate(data.data);
      if (isLogin) {
        const blob = new Blob([data.data]);
        saveAs(blob, filename);
      } else {
        const resText = await data.text();
        const rspObj = JSON.parse(resText);
        const errMsg =
          errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
        ElMessage.error(errMsg);
      }
      downloadLoadingInstance.close();
    })
    .catch((r) => {
      console.error(r);
      ElMessage.error("下载文件出现错误，请联系管理员！");
      downloadLoadingInstance.close();
    });
}

export default instance;
export { baseURL };
